import router from '@/router';
import axios, { InternalAxiosRequestConfig, AxiosResponse } from 'axios';
import { ElMessageBox } from 'element-plus';
import { useUserStore } from '@store/modules/user';
import { refreshToken } from '@api/user';

// 创建axios的实例
const service = axios.create({
    baseURL: import.meta.env.VITE_APP_BASE_API,
    headers: {
        'Content-Type': 'application/json;charset=utf-8',
        // 'Content-Type': 'application/x-www-form-urlencoded',
        // 'Access-Control-Allow-Credentials': 'true',
        // 'Access-Control-Allow-Origin':'*'
    },
    withCredentials: true, // 跨域请求时是否需要使用凭证
    timeout: 5000,
});

// 添加请求拦截器
service.interceptors.request.use(
    (config: InternalAxiosRequestConfig) => {
        // 摒弃 Bearer + token，由客户端cookie携带token
        return config;
    },
    (error: any) => {
        // console.log('发送请求错误', error.response, error.data);

        // 抛出错误
        ElMessage({
            message: '本地网络出错，请检查网络状况',
            type: 'error',
        });

        return Promise.reject(error);
    }
);

//添加响应拦截器
service.interceptors.response.use(
    (response: AxiosResponse) => {
        // console.log('响应拦截', response.status, response);
        // 二进制数据则直接返回
        if (response.request.responseType === 'blob' || response.request.responseType === 'arraybuffer') {
            return response;
        }

        return response;
    },
    async (error: any) => {
        console.log('请求错误', error, error.message);

        /* **************************************特殊状态码处理************************************** */
        // 请求参数不完整
        if (error.status === 400 || error.response.status === 400) {
            ElMessage({
                message: error.response.data.message || '丢失必要的请求参数。',
                type: 'error',
                duration: 3000,
            });
            return;
        }

        // 账户被封禁
        if (error.status === 406 || error.response.status === 406) {
            ElMessageBox.confirm('您的账户已被封禁，请联系管理员', '系统提示', {
                confirmButtonText: '重新登录',
                cancelButtonText: '取消',
                type: 'warning',
            }).then(() => {
                // 清除用户信息
                useUserStore()
                    .logout()
                    .then(() => router.push({ path: '/login' }));
                return;
            });
            return;
        }

        // 会话已过期
        if (error.status === 401 || error.response.status === 401) {
            // 权限变动，重新登录
            ElMessageBox.confirm('登录状态已过期，您可以继续留在该页面，或者重新登录', '系统提示', {
                confirmButtonText: '重新登录',
                cancelButtonText: '取消',
                type: 'warning',
            }).then(() => {
                // 清除用户信息
                useUserStore()
                    .logout()
                    .then(() => router.push({ path: '/login' }));
                return;
            });
            return;
        }

        // 无感登录
        if (error.status === 421 || error.response.status === 421) {
            const refreshResult = await refreshToken();
            if (refreshResult.code == 200) {
                // 重新请求之前的请求
                return await service(error.config);
            } else {
                // 刷新token失败，则退出登录
                useUserStore().logout();
                return;
            }
        }

        // 请求未授权
        if (error.status === 403 || error.response.status === 403) {
            router.push({ path: '/403' });
            return;
        }

        // 请求未找到
        if (error.status === 404 || error.response.status === 404) {
            router.push({ path: '/404' });
            return;
        }

        /* *************************************状态码处理************************************** */
        const { message } = error;
        // 如果有返回的message，则使用服务器返回的错误信息
        let _message = error.response.data.message || '';

        if (!_message) {
            if (message == 'Network Error') {
                _message = '后端接口连接异常';
            } else if (message.includes('timeout')) {
                _message = '系统接口请求超时';
            } else if (message.includes('Request failed with status code')) {
                _message = '系统接口' + message.substr(message.length - 3) + '异常';
            }
        }

        // 根据服务器返回的错误信息进行异常处理
        ElMessage({ message: _message, type: 'error', duration: 3000 });
        return Promise.reject(error);
    }
);

export default service;
